package com.bitoon.basketdudes.web;

import com.bitoon.basketdudes.web.commons.RankingCommon;
import com.bitoon.basketdudes.web.datos.DatosRanking;
import com.bitoon.basketdudes.web.jpa.Invitacion;
import com.bitoon.basketdudes.web.jpa.InvitacionPeticion;
import com.bitoon.basketdudes.web.jpa.Juego;
import com.opensymphony.xwork2.*;
import javax.persistence.*;
import org.apache.log4j.Logger;
import java.util.*;

public class CodigoValidacion extends BaseAction {

    private Logger log = Logger.getLogger(CodigoValidacion.class);
    
    // Pantalla de validacion
    private String codigo;
    private String url; // Redirección según idioma
    
    // Pantalla de solicitud
    private String email_registro;
    private String motivos;

    @Override
    public String execute() {
        /*
         * Versión anterior a la publicación de 15.06.2011
         *
        String retorno = SUCCESS;

        if (log.isDebugEnabled()) {
            log.debug("invitaciones: execute, codigo: " + codigo);
        }

        if (codigo!=null) {
            retorno = comprobarCodigo(codigo,1);
            log.debug("retorno: " + retorno);
        } else {
            if (getMotivos() != null
                    && getEmail_registro() != null) {

                // Grabar la solicitud en la base de datos
                grabarSolicitudCodigo(getEmail_registro(), getMotivos());

            }
        }
         *
         */

        String retorno = REDIRECT;
        String idioma = (String)session.get("bd_lang");
        setUrl("/register/data/");

        return retorno;
    }

    public int grabarSolicitudCodigo(String email, String motivos) {
        int retorno = 0;

        log.debug("grabarSolicitudCodigo");
        
        InvitacionPeticion peticion = null;
        EntityManager em = null;

        try {
            em = emfBasket.createEntityManager(); // checked
            peticion = new InvitacionPeticion();
            peticion.setEmail(email);
            peticion.setMotivo(motivos);
            peticion.setJuego((Juego)em.find(Juego.class, ID_JUEGO_BASKETDUDES));
            peticion.setOrigen((short)1); // Origen web
            peticion.setEstado((short)0); // No leído
            peticion.setFAlta(new Date());
            em.getTransaction().begin();
            em.persist(peticion);
            em.getTransaction().commit();
        } catch (Exception e) {
            log.error("[grabarSolicitudCodigo]", e);
        } finally {
            try { if (em.getTransaction().isActive()) { em.getTransaction().rollback(); }; } catch (Exception e) { }
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }

    public String comprobarCodigo(String codigo, int idJuego) {
        String retorno = NOT_FOUND;

        log.debug("Comprobar codigo: " + codigo + " de juego " + idJuego);

        Invitacion invitacion = null;
        EntityManager em = null;

        try {
            em = emfBasket.createEntityManager(); // checked

            Query q = em.createNamedQuery("Invitacion.comprobarNoUtilizadaPorId");
            q.setParameter("id", codigo);
            invitacion = (Invitacion)q.getSingleResult();

            log.debug("invitacion: " + invitacion);

            if (invitacion.getJuego().getId()==idJuego) {
                // El código pertenece al juego
                log.debug("correcto");
                Map session = ActionContext.getContext().getSession();
                session.put("invitacion", codigo);

                retorno = REDIRECT;

                // Poner url de redirección según idioma

                String idioma = (String)session.get("bd_lang");
                setUrl("/register/data");

            } else {
                // La activación ya se utilizó
                retorno = NOT_FOUND;
            }
        } catch (NoResultException e) {
            // No existen datos para la invitacion
            log.debug("No existe la invitacion");
            retorno = NOT_FOUND;
        } catch (Exception e) {
            log.error("[comprobarCodigo]", e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }




    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public String getEmail_registro() {
        return email_registro;
    }

    public void setEmail_registro(String email_registro) {
        this.email_registro = email_registro;
    }

    public String getMotivos() {
        return motivos;
    }

    public void setMotivos(String motivos) {
        this.motivos = motivos;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

}
